package com.rc.web.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Row;
import com.rc.common.constant.RoleEnum;
import com.rc.pojo.dto.activity.ActivityPageQuery;
import com.rc.pojo.po.Activity;
import com.rc.pojo.vo.activity.PageActivityVO;

import java.time.LocalDateTime;
import java.util.List;

import static com.rc.pojo.po.table.ActivityTableDef.ACTIVITY;
import static com.rc.pojo.po.table.AreaTableDef.AREA;
import static com.rc.pojo.po.table.FarmTableDef.FARM;
import static com.rc.pojo.po.table.UserTableDef.USER;

/**
 * 活动表 映射层。
 * 提供活动相关的数据库操作接口
 */
public interface ActivityMapper extends BaseMapper<Activity> {

    /**
     * 根据区域ID和时间查询活动列表
     * @param areaId 区域ID
     * @param time 查询时间
     * @return 活动列表
     */
    default List<Activity> selectByAreaAndTime (long areaId,LocalDateTime time){
        return selectListByQuery(QueryWrapper.create()
                .where(ACTIVITY.AREA_ID.eq(areaId))
                .and(ACTIVITY.BEGIN_TIME.le(time))
                .and(ACTIVITY.END_TIME.ge(time))
        );
    }

    /**
     * 分页查询活动列表
     * @param dto 分页查询条件
     * @return 分页结果
     */
    default Page<PageActivityVO> selectPage(ActivityPageQuery dto){
        Page<PageActivityVO> page = Page.of(dto.getCurrent(),dto.getPageSize());
        return paginateAs(page,QueryWrapper.create()
                        .select(ACTIVITY.ALL_COLUMNS,AREA.NAME.as("areaName"))
                        .leftJoin(AREA)
                        .on(ACTIVITY.AREA_ID.eq(AREA.ID))
                        .from(ACTIVITY)
                        .and(ACTIVITY.TITLE.like(dto.getTitle()))
                        .and(ACTIVITY.AREA_ID.eq(dto.getAreaId()))
                ,PageActivityVO.class);
    }

    /**
     * 查询活动详情
     * @param id 活动ID
     * @return 活动详情行数据
     */
    default Row selectDetail(long id){
        return selectOneByQueryAs(QueryWrapper.create()
                        .select(ACTIVITY.ALL_COLUMNS, AREA.NAME.as("address"), FARM.NAME.as("farmName"), USER.ID.as("farmAdminId"), USER.AVATAR.as("farmAdminAvatar"))
                        .leftJoin(AREA).on(ACTIVITY.AREA_ID.eq(AREA.ID))
                        .leftJoin(FARM).on(ACTIVITY.FARM_ID.eq(FARM.ID)).and(ACTIVITY.ID.eq(id))
                        .leftJoin(USER).on(USER.FARM_ID.eq(FARM.ID)).and(USER.ROLE.eq(RoleEnum.FARM_ADMIN))
                , Row.class
        );
    }
}
